part of '../writer.dart';

/// 由于这个Writer有很多变体，而使用这一套测试就可以将当前接口都测试一遍，无需在别的子类中重新测试相同的接口
/// 在测试完毕后，请自行删除多余的文件
testRawableWriter(RawableWriter<PseudoPeople> writer) {
  /// 第一个测试已经覆盖了all、findBy和getBy的基本使用
  test("常规读写、删除测试", () {
    writer.deletAll();
    expect(writer.all, isEmpty);
    // 写入一个信息，能够读取到长度为1
    writer.input(pseudoThree);
    expect(writer.all, hasLength(1));
    // 根据各种条件查找，可以找到相应的对象
    final PseudoPeople? found = writer.findBy((p) => p.name == "张三");
    final PseudoPeople got = writer.getBy((p) => p.name == "张三");
    expect(found, isNotNull);
    expect(found!.id, "3");
    expect(got.id, "3");
    // 根据条件删除，得到结果为空，writer中又没有任何东西了
    bool result = writer.deleteBy((p) => p.name == "张三");
    expect(result, isTrue);
    expect(writer.all, isEmpty);
  });

  test("删除所有测试", () {
    // 加入一些人
    writer.deletAll();
    expect(writer.all, isEmpty);
    writer.input(pseudoThree);
    writer.input(pseudoFour);
    expect(writer.all, hasLength(2));
    // 使用deleteAll方法，发现整个清空了
    writer.deletAll();
    expect(writer.all, isEmpty);
  });

  test("空测试", () {
    writer.deletAll();
    // 当writer为空时，预测findBy和getBy的表现
    expect(writer.all, isEmpty);
    expect(writer.findBy((p) => p.name == "张三"), isNull); // 找到一个空
    expect(() => writer.getBy((p) => p.name == "张三"), isBug); // 会抛出错误
    expect(writer.deleteBy((p) => p.name == "张三"), isFalse); // 会得到一个false
  });
}
